/* Copyright (c) 2016-2020 Enfry Ltd. All Rights Reserved.
 * 
 * This software is the confidential and proprietary information of Enfry. 
 * You shall not disclose such Confidential Information
 * and shall use it only in accordance with the terms of the agreements
 * you entered into with Enfry.
 */
package com.enfry.common.util.data;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.SimpleTimeZone;

import com.enfry.common.util.String.Strings;
import com.enfry.common.util.constants.EnumConstants;
import com.enfry.common.util.validate.Validates;

/**
 * 时间工具类
 * 
 * @Title com.enfry.wf.util.DateTimeUtils
 * @author Penghu
 * @date 2016年10月12日
 */
public class DateTimes implements EnumConstants {
	/********************************************************/
	// 日历转换，String和Calendar之间转换
	/********************************************************/

	/** 返回当前时间的Date */
	public static Date nowDate() {
		return new Date();
	}

	/**
	 * 字符串转为日历,字符串符合标准格式:"yyyy-MM-dd HH:mm:ss"
	 * 
	 * @param datetime 标准时间格式 "yyyy-MM-dd HH:mm:ss"
	 * @return Calendar
	 */
	public static Calendar toCalendar(String datetime) {
		int index = datetime.indexOf(" ");
		String date = datetime.substring(0, index);
		String time = datetime.substring(index + 1);

		return toCalendar(date, time);
	}

	/**
	 * 字符串转为日历,字符串符合标准日期格式:"yyyy-MM-dd",和标准时间格式:"HH:mm:ss"
	 * 
	 * @param date 标准日期格式 "yyyy-MM-dd"
	 * @param time 标准时间格式 "HH:mm:ss"
	 * @return Calendar
	 */
	public static Calendar toCalendar(String date, String time) {
		if (date == null || time == null)
			throw new IllegalArgumentException("非法的参数[date:" + date + ",time:" + time + "]");

		int dateSlash1 = date.indexOf("-");
		int dateSlash2 = date.lastIndexOf("-");

		if (dateSlash1 <= 0 || dateSlash1 == dateSlash2)
			throw new IllegalArgumentException("非法的参数[date:" + date + "]");

		int timeColon1 = time.indexOf(":");
		int timeColon2 = time.lastIndexOf(":");

		if (timeColon1 <= 0 || timeColon1 == timeColon2)
			throw new IllegalArgumentException("非法的参数[time:" + time + "]");

		String year = date.substring(0, dateSlash1);
		String month = date.substring(dateSlash1 + 1, dateSlash2);
		String day = date.substring(dateSlash2 + 1);

		String hour = time.substring(0, timeColon1);
		String minute = time.substring(timeColon1 + 1, timeColon2);
		String second = time.substring(timeColon2 + 1);
		;

		return toCalendar(year, month, day, hour, minute, second);
	}

	/**
	 * 通过标准时间输入,年,月,日,时,分,秒,生成Calendar，默认毫秒为0
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @return Calendar
	 */
	public static Calendar toCalendar(String year, String month, String day, String hour,
			String minute, String second) {
		int yyyy = Integer.parseInt(year);
		int MM = Integer.parseInt(month);
		int dd = Integer.parseInt(day);
		int HH = Integer.parseInt(hour);
		int mm = Integer.parseInt(minute);
		int ss = Integer.parseInt(second);

		return toCalendar(yyyy, MM, dd, HH, mm, ss);
	}

	/**
	 * 通过标准时间输入,年,月,日,时,分,秒,生成Calendar，默认毫秒为0
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @return Calendar
	 */
	public static Calendar toCalendar(int year, int month, int day, int hour, int minute, int second) {
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month - 1);
		c.set(Calendar.DATE, day);
		c.set(Calendar.HOUR_OF_DAY, hour);
		c.set(Calendar.MINUTE, minute);
		c.set(Calendar.SECOND, second);
		c.set(Calendar.MILLISECOND, 0);

		return c;
	}

	/**
	 * 日历转字符串，给定格式的日期时间字符串
	 * 
	 * @param calendar 日历,给定一个日历
	 * @param format 格式,如String format = "yyyy-MM-dd HH:mm:ss";
	 * @return String 取得给定日历,给定格式的日期时间字符串
	 */
	public static String toDateTimeString(Calendar calendar, String format) {
		return new SimpleDateFormat(format).format(calendar.getTime());
	}

	/**
	 * 日历转标准时间字符串
	 * 
	 * @param calendar 日历,给定一个日历
	 * @return String 取得默认的日期时间字符串"yyyy-MM-dd HH:mm:ss"
	 */
	public static String toDateTimeString(Calendar calendar) {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
	}

	/**
	 * 日历转标准日期字符串
	 * 
	 * @param calendar 日历,给定一个日历
	 * @return String 取得默认的日期时间字符串"yyyy-MM-dd"
	 */
	public static String toDateString(Calendar calendar) {
		return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
	}

	/********************************************************/
	// 时间值转换，String和long之间转换
	/********************************************************/

	/**
	 * 取得给定时间,给定格式的日期时间字符串,标准格式:"yyyy-MM-dd HH:mm:ss";
	 * 
	 * @param datetime 日期,给定一个时间的毫秒数
	 * @return String 取得给定时间,给定格式的日期时间字符串
	 */
	public static String toDateTimeString(long datetime) {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(datetime));
	}

	/**
	 * 取得给定时间,给定格式的日期时间字符串,标准格式:"yyyy-MM-dd HH:mm:ss,SSS";
	 * 
	 * @param datetime 日期,给定一个时间的毫秒数
	 * @return String 取得给定时间,给定格式的日期时间字符串
	 */
	public static String toDateTimeSSSString(long datetime) {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS").format(new Date(datetime));
	}

	/**
	 * 取得给定时间,给定格式的日期时间字符串
	 * 
	 * @param datetime 日期,给定一个时间的毫秒数
	 * @param format 格式,如String format = "yyyy-MM-dd HH:mm:ss";
	 * @return String 取得给定时间,给定格式的日期时间字符串
	 */
	public static String toDateTimeString(long datetime, String format) {
		return new SimpleDateFormat(format).format(new Date(datetime));
	}

	/**
	 * 取得当前时间,给定格式的日期时间字符串
	 * 
	 * @param format 格式,如String format = "yyyy-MM-dd HH:mm:ss";
	 * @return String 取得给定时间,给定格式的日期时间字符串
	 */
	public static String toCurrentDateTimeString(String format) {
		return new SimpleDateFormat(format).format(new Date());
	}

	/**
	 * 通过标准时间输入,年,月,日,时,分,秒,生成long值
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @return long
	 */
	public static long toLong(int year, int month, int day, int hour, int minute, int second) {
		return toCalendar(year, month, day, hour, minute, second).getTimeInMillis();
	}

	/**
	 * 通过标准时间输入,年,月,日,时,分,秒,生成long值
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @return long
	 */
	public static long toLong(String year, String month, String day, String hour, String minute,
			String second) {
		return toCalendar(year, month, day, hour, minute, second).getTimeInMillis();
	}

	/**
	 * 字符串转为Long时间
	 * 
	 * @param datetime 标准日期格式 "yyyy-MM-dd HH:mm:ss"
	 * @return long
	 */
	public static long toLong(String datetime) {
		return toCalendar(datetime).getTimeInMillis();
	}

	/**
	 * 字符串转为时间,字符串符合标准日期格式:"yyyy-MM-dd",和标准时间格式:"HH:mm:ss"
	 * 
	 * @param date 标准日期格式 "yyyy-MM-dd"
	 * @param time 标准时间格式 "HH:mm:ss"
	 * @return long
	 */
	public static long toLong(String date, String time) {
		return toCalendar(date, time).getTimeInMillis();
	}

	/********************************************************/
	// 时间转换，String和Date之间转换
	/********************************************************/
	/**
	 * 生成标准日期,格式为 yyyy-MM-dd
	 * 
	 * @param date The Date
	 * @return 生成日期,格式为 yyyy-MM-dd
	 */
	public static String toDateString(Date date) {
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}

	/**
	 * 生成format日期,格式为 yyyy-MM-dd
	 * 
	 * @param date 日期对象
	 * @param format 格式如yyyy-MM-dd HH:mm:ss
	 * @return 生成日期,格式为 yyyy-MM-dd
	 */
	public static String toDateTimeString(Date date, String format) {
		return new SimpleDateFormat(format).format(date);
	}

	/**
	 * 生成标准格式的字符串 格式为: "yyyy-MM-dd HH:mm:ss"
	 *
	 * @param date The Date
	 * @return 生成默认格式的字符串 格式为: "yyyy-MM-dd HH:mm:ss"
	 */
	public static String toDateTimeString(Date date) {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
	}

	/**
	 * 字符串转为时间,字符串符合标准格式:"yyyy-MM-dd HH:mm:ss"
	 * 
	 * @param datetime 标准时间格式 "yyyy-MM-dd HH:mm:ss"
	 * @return Date 日期对象
	 */
	public static Date toDate(String datetime) {
		return toCalendar(datetime).getTime();
	}

	/**
	 * 字符串转为时间,字符串符合标准日期格式:"yyyy-MM-dd",和标准时间格式:"HH:mm:ss"
	 * 
	 * @param date 标准日期格式 "yyyy-MM-dd"
	 * @param time 标准时间格式 "HH:mm:ss"
	 * @return Date
	 */
	public static Date toDate(String date, String time) {
		return toCalendar(date, time).getTime();
	}

	/**
	 * 通过标准时间输入,年,月,日,时,分,秒,生成Date,毫秒位为000
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @return Date
	 */
	public static Date toDate(String year, String month, String day, String hour, String minute,
			String second) {
		return toCalendar(year, month, day, hour, minute, second).getTime();
	}

	/**
	 * 通过标准时间输入,年,月,日,时,分,秒,生成Date,毫秒位为000
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @return Date
	 */
	public static Date toDate(int year, int month, int day, int hour, int minute, int second) {
		return toCalendar(year, month, day, hour, minute, second).getTime();
	}

	/**
	 * 根据输入的时,分,秒,生成时间格式 HH:mm:ss
	 * 
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @return 生成时间格式为HH:mm:ss
	 */
	public static String toTimeString(int hour, int minute, int second) {
		String h = "" + hour;
		String m = "" + minute;
		String s = "" + second;

		if (hour < 10)
			h = "0" + hour;

		if (minute < 10)
			m = "0" + minute;

		if (second < 10)
			s = "0" + second;

		return h + ":" + m + ":" + s;
	}

	/**
	 * 根据输入的时间,生成时间格式 HH:mm:ss
	 * 
	 * @param date Date
	 * @return 生成时间格式为HH:mm:ss
	 */
	public static String toTimeString(Date date) {
		return new SimpleDateFormat("HH:mm:ss").format(date);
	}

	/********************************************************/
	// 相关的日期计算方法
	/********************************************************/

	/**
	 * 获取指定月天数,格式：yyyyMM
	 * 
	 * @param yearMonth 格式：yyyyMM
	 * @return 2月28/29，1月31
	 */
	public static int getMonthDays(String yearMonth) {
		int year = Integer.parseInt(yearMonth.substring(0, 4));
		int month = Integer.parseInt(yearMonth.substring(4));
		return getMonthDays(year, month);
	}

	/**
	 * 获取指定月天数
	 * 
	 * @param yearMonth 年月份201305
	 * @return 2月28/29，1月31
	 */
	public static int getMonthDays(int yearMonth) {
		int year = yearMonth / 100;
		int month = yearMonth % 100;
		return getMonthDays(year, month);
	}

	/**
	 * 获取指定月天数
	 * 
	 * @param year 年份
	 * @param month 月份
	 * @return 2月28/29，1月31
	 */
	public static int getMonthDays(int year, int month) {
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return 31;
		case 4:
		case 6:
		case 9:
		case 11:
			return 30;
		default:// 2月
			boolean isLeapYear = Validates.isLeapYear(year);
			return isLeapYear ? 29 : 28;
		}
	}

	/**
	 * 获取指定年月的下一个年月，格式:yyyyMM
	 * 
	 * @param yearMonth 指定的年月，格式:yyyyMM
	 * @return yyyyMM
	 */
	public static int getNextYearMonth(int yearMonth) {
		int year = yearMonth / 100;
		int month = yearMonth % 100;
		if (month < 12)
			month += 1;
		else {
			year += 1;
			month = 1;
		}

		return year * 100 + month;
	}

	/**
	 * 获取指定年月的下一个年月，格式:yyyyMM
	 * 
	 * @param yearMonth 指定的年月，格式:yyyyMM
	 * @return yyyyMM
	 */
	public static String getNextYearMonth(String yearMonth) {
		int curYearMonth = Integer.parseInt(yearMonth);
		return String.valueOf(getNextYearMonth(curYearMonth));
	}

	/**
	 * 获到下一个月份yyyy-MM, curYearMonth格式yyyyMM或yyyy-MM
	 * 
	 * @param yearMonth 指定的年月，格式:yyyyMM或yyyy-MM
	 * @return yyyy-MM
	 */
	public static String getNextYearMonthSpe(String yearMonth) {
		yearMonth = yearMonth.replace("-", "");
		String nextYearMonth = getNextYearMonth(yearMonth);
		return nextYearMonth.substring(0, 4) + "-" + nextYearMonth.substring(4);
	}

	/**
	 * 获取下一日的值, yyyyMMdd
	 * 
	 * @param curDate yyyyMMdd格式的int型值
	 * @return yyyyMMdd格式的int型值
	 */
	public static int getNextDateInt(int curDate) {
		int yearMonth = curDate / 100;
		int day = curDate % 100;

		int monthDays = getMonthDays(yearMonth);
		if (day < monthDays)
			day += 1;
		else {
			yearMonth = getNextYearMonth(yearMonth);
			day = 1;
		}

		return yearMonth * 100 + day;
	}

	/**
	 * 获取下一小时的值, yyyyMMddHH
	 * 
	 * @param curHour yyyyMMddHH格式的long型值
	 * @return yyyyMMddHH格式的long型值
	 */
	public static long getNextHour(long curHour) {
		long yearMonthDay = curHour / 100;
		long hour = curHour % 100;

		if (hour < 23)
			hour += 1;
		else {
			yearMonthDay = getNextDateInt((int) yearMonthDay);
			hour = 0;
		}

		return yearMonthDay * 100 + hour;
	}

	/**
	 * 获取下一分钟的值, yyyyMMddHHmm
	 * 
	 * @param curMinute yyyyMMddHHmm格式的long型值
	 * @return yyyyMMddHHmm格式的long型值
	 */
	public static long getNextMinute(long curMinute) {
		long yearMonthDayHour = curMinute / 100;
		long minute = curMinute % 100;

		if (minute < 59)
			minute += 1;
		else {
			yearMonthDayHour = getNextHour((int) yearMonthDayHour);
			minute = 0;
		}

		return yearMonthDayHour * 100 + minute;
	}

	/**
	 * 获取指定年月的上一个年月，格式:yyyyMM
	 * 
	 * @param yearMonth 指定的年月，格式:yyyyMM
	 * @return yyyyMM
	 */
	public static String getPreviousYearMonth(String yearMonth) {
		int year = Integer.parseInt(yearMonth.substring(0, 4));
		int month = Integer.parseInt(yearMonth.substring(4));
		if (month == 1) {
			year -= 1;
			month = 12;
		} else {
			month -= 1;
		}

		StringBuffer strb = new StringBuffer().append(year);
		if (month > 9)
			strb.append(month);
		else
			strb.append("0").append(month);
		return strb.toString();
	}

	/**
	 * 获到上一个月份yyyy-MM, curYearMonth格式yyyyMM或yyyy-MM
	 * 
	 * @param yearMonth 指定的年月，格式:yyyyMM或yyyy-MM
	 * @return yyyy-MM
	 */
	public static String getPreviousYearMonthSpe(String yearMonth) {
		yearMonth = yearMonth.replace("-", "");
		String prevYearMonth = getPreviousYearMonth(yearMonth);
		return prevYearMonth.substring(0, 4) + "-" + prevYearMonth.substring(4);
	}

	/**
	 * 获到指定月最后一天yyyy-MM-dd
	 * 
	 * @param yearMonth yyyyMM
	 * @return 如2014-02-28,2014-01-31
	 */
	public static String getLastMonthDay(String yearMonth) {
		String yearStr = yearMonth.substring(0, 4);
		String monthStr = yearMonth.substring(4);
		int year = Integer.parseInt(yearStr);
		int month = Integer.parseInt(monthStr);
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return yearStr + "-" + monthStr + "-31";
		case 4:
		case 6:
		case 9:
		case 11:
			return yearStr + "-" + monthStr + "-30";
		case 2:
			int day = Validates.isLeapYear(year) ? 29 : 28;
			return yearStr + "-" + monthStr + "-" + day;
		}

		throw new IllegalArgumentException("请求参数[" + yearMonth + "]格式不对或数据不对");
	}

	/********************************************************/
	// 时间比较
	/********************************************************/

	/**
	 * 获取两个日期对象相差年数，不管月日，如2014-02-19比2013-12-22年份差值为1
	 * 
	 * @param date1 日期对象
	 * @param date2 日期对象
	 * @return int 年份差值
	 */
	public static int compareYear(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			throw new IllegalArgumentException("参数有为null的值[date1:" + date1 + "],[date2:" + date2
					+ "]");

		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date1);
		int year1 = calendar.get(Calendar.YEAR);

		calendar.setTime(date2);
		int year2 = calendar.get(Calendar.YEAR);

		return year1 - year2;
	}

	/**
	 * 获取两个日期对象相差月数，年月一起比，如2014-02比2013-12差值为12*(2014-2013)+(2-12)=2，日期不处理
	 * 
	 * @param date1 日期对象
	 * @param date2 日期对象
	 * @return int 月份差值
	 */
	public static int compareMonth(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;

		int year = compareYear(date1, date2);

		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date1);
		int month1 = calendar.get(Calendar.MONTH);

		calendar.setTime(date2);
		int month2 = calendar.get(Calendar.MONTH);

		/* 进行比较 */
		return 12 * year + (month1 - month2);

	}

	/**
	 * 获取两个日期对象相差月数,大一整月才算大一个月
	 * 
	 * @param date1 字符串对象
	 * @param date2 字符串对象
	 * @return int 月份差值
	 */
	public static int compareMonth(String date1, String date2) {
		if (date1 == null || date2 == null)
			return 0;

		int year1 = Integer.parseInt(date1.substring(0, 4));
		int year2 = Integer.parseInt(date2.substring(0, 4));
		int month1 = Integer.parseInt(date1.substring(5, 7));
		int month2 = Integer.parseInt(date2.substring(5, 7));
		int day1 = Integer.parseInt(date1.substring(8, 10));
		int day2 = Integer.parseInt(date2.substring(8, 10));

		int value = (year1 - year2) * 12 + (month1 - month2);
		if (day1 < day2)
			value--;

		return value;
	}

	/**
	 * 获取两个日期对象相差天数
	 * 
	 * @param date1str String yyyy-MM-dd
	 * @param date2str String yyyy-MM-dd
	 * @return int 日差值
	 */
	public static int compareDay(String date1str, String date2str) {
		if (Validates.isEmpty(date1str) || Validates.isEmpty(date2str))
			return 0;

		Date date1 = toDate(date1str, "00:00:00");
		Date date2 = toDate(date2str, "00:00:00");

		return compareDay(date1, date2);
	}

	/**
	 * 获取两个日期对象相差天数
	 * 
	 * @param date1 日期对象
	 * @param date2 日期对象
	 * @return int 日差值
	 */
	public static int compareDay(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;

		long time1 = date1.getTime();
		long time2 = date2.getTime();

		long margin = time1 - time2;

		/* 转化成天数 */
		int ret = (int) Math.floor((double) margin / (1000 * 60 * 60 * 24));

		return ret;
	}

	/**
	 * 获取两个日期对象相差的小时数
	 * 
	 * @param date1str String yyyy-MM-dd hh:mm:ss
	 * @param date2str String yyyy-MM-dd hh:mm:ss
	 * @return int 相差小时数
	 */
	public static int compareHour(String date1str, String date2str) {
		if (date1str == null || date2str == null)
			return 0;

		Date date1 = toDate(date1str);
		Date date2 = toDate(date2str);

		return compareHour(date1, date2);
	}

	/**
	 * 获取两个日期对象相差的小时数
	 * 
	 * @param date1 日期对象
	 * @param date2 日期对象
	 * @return int 相差小时数
	 */
	public static int compareHour(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;

		long time1 = date1.getTime();
		long time2 = date2.getTime();

		long margin = time1 - time2;

		int ret = (int) Math.floor((double) margin / (1000 * 60 * 60));

		return ret;
	}

	/**
	 * 获取两个日期对象相差的分钟数
	 * 
	 * @param date1str String yyyy-MM-dd hh:mm:ss
	 * @param date2str String yyyy-MM-dd hh:mm:ss
	 * @return int 相差分钟数
	 */
	public static int compareMinute(String date1str, String date2str) {
		if (date1str == null || date2str == null)
			return 0;

		Date date1 = toDate(date1str);
		Date date2 = toDate(date2str);

		return compareMinute(date1, date2);
	}

	/**
	 * 获取两个日期对象相差的分钟数
	 * 
	 * @param date1 日期对象
	 * @param date2 日期对象
	 * @return int 相差分钟数
	 */
	public static int compareMinute(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;

		long time1 = date1.getTime();
		long time2 = date2.getTime();

		long margin = time1 - time2;

		int ret = (int) Math.floor((double) margin / (1000 * 60));

		return ret;
	}

	/**
	 * 获取两个日期对象相差秒数
	 * 
	 * @param date1str String yyyy-MM-dd hh:mm:ss
	 * @param date2str String yyyy-MM-dd hh:mm:ss
	 * @return int 相差秒数
	 */
	public static int compareSecond(String date1str, String date2str) {
		if (date1str == null || date2str == null)
			return 0;

		Date date1 = toDate(date1str);
		Date date2 = toDate(date2str);

		return compareSecond(date1, date2);
	}

	/**
	 * 获取两个日期对象相差秒数
	 * 
	 * @param date1 日期对象
	 * @param date2 日期对象
	 * @return int 相差秒数
	 */
	public static int compareSecond(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;

		long time1 = date1.getTime();
		long time2 = date2.getTime();

		long margin = time1 - time2;

		Long longValue = new Long(margin / (1000));

		return longValue.intValue();
	}

	public static long compareSSS(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;

		long time1 = date1.getTime();
		long time2 = date2.getTime();

		long margin = time1 - time2;
		return margin;
	}

	/********************************************************/
	// 时间转换，String和Date之间转换
	/********************************************************/

	/**
	 * 取得当前时间的HTTP要求格式
	 * 
	 * @return format: Wed 25 08 2011 12:11:35 GMT
	 */
	public static String getDateTimeHttpFormat() {
		Calendar calendar = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));
		return getDateTimeHttpFormat(calendar);
	}

	/**
	 * 取得指定时间的HTTP要求格式
	 * 
	 * @return format: Wed 25 08 2011 12:11:35 GMT
	 */
	public static String getDateTimeHttp(long millis) {
		Calendar calendar = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));
		calendar.setTimeInMillis(millis);
		return getDateTimeHttpFormat(calendar);
	}

	/**
	 * 取得指定时间的HTTP要求格式
	 * 
	 * @return format: Wed 25 08 2011 12:11:35 GMT
	 */
	public static String getDateTimeHttpNextHour() {
		Calendar calendar = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));
		calendar.add(Calendar.HOUR_OF_DAY, 1);
		return getDateTimeHttpFormat(calendar);
	}

	/**
	 * 取得指定Calendar时间的HTTP要求格式
	 * 
	 * @return format: Wed 25 08 2011 12:11:35 GMT
	 */
	public static String getDateTimeHttpFormat(Calendar calendar) {
		StringBuffer buf = new StringBuffer();
		int week = calendar.get(Calendar.DAY_OF_WEEK);
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int month = calendar.get(Calendar.MONTH);
		int year = calendar.get(Calendar.YEAR);

		int epoch = (int) ((calendar.getTimeInMillis() / 1000) % (60 * 60 * 24));
		int seconds = epoch % 60;
		epoch = epoch / 60;
		int minutes = epoch % 60;
		int hours = epoch / 60;

		buf.append(WEEKS[week]);
		buf.append(',');
		buf.append(' ');
		buf.append(Strings.prefixZero(day, 2));

		buf.append(' ');
		buf.append(MONTHS[month]);
		buf.append(' ');
		buf.append(Strings.prefixZero(year, 4));

		buf.append(' ');
		buf.append(Strings.prefixZero(hours, 2));
		buf.append(':');
		buf.append(Strings.prefixZero(minutes, 2));
		buf.append(':');
		buf.append(Strings.prefixZero(seconds, 2));
		buf.append(" GMT");

		return buf.toString();
	}

	/********************************************************/
	// 求星期取值
	/********************************************************/

	/**
	 * 获取指定时间的星期数:星期日=7;星期一=1;星期二=2;星期三=3;星期四=4;星期五=5;星期六=6;
	 * 
	 * @return 周数值
	 */
	public static int getDateWeek(String date) {
		return getDateTimeWeek(date + " 00:00:01");
	}

	/**
	 * 获取指定时间的星期数:星期日=7;星期一=1;星期二=2;星期三=3;星期四=4;星期五=5;星期六=6;
	 * 
	 * @return 周数值
	 */
	public static int getDateTimeWeek(String datetime) {
		Calendar calendar = toCalendar(datetime);
		int week = calendar.get(Calendar.DAY_OF_WEEK);
		week = week - 1;
		if (week == 0)
			week = 7;

		return week;
	}

	/*************************************************************/
	// 获取当前时间值，年、月、日期、小时、分钟、秒、星期
	/*************************************************************/

	/**
	 * @return int[10]<br>
	 *         int[0] = year 4位数字<br>
	 *         int[1] = month 1-12<br>
	 *         int[2] = day 1-31<br>
	 *         int[3] = hour 0-23<br>
	 *         int[4] = min 0-59<br>
	 *         int[5] = sec 0-59<br>
	 *         int[6] = msec 0-59<br>
	 *         int[7] = week 1-7<br>
	 *         int[8] = yearMonth 201401<br>
	 *         int[9] = monthDays 28-31，当月天数
	 */
	public static int[] getCurrent() {
		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH) + 1;
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int min = calendar.get(Calendar.MINUTE);
		int sec = calendar.get(Calendar.SECOND);
		int msec = calendar.get(Calendar.MILLISECOND);
		int week = calendar.get(Calendar.DAY_OF_WEEK);
		week = week - 1;
		if (week == 0)
			week = 7;// 变成周一至周七分别为1-7

		int yearMonth = year * 100 + month;
		int monthDays = getMonthDays(year, month);// 月天数

		return new int[] { year, month, day, hour, min, sec, msec, week, yearMonth, monthDays };
	}

	/**
	 * 获取当前日期
	 * 
	 * @return 当前日期
	 */
	public static int getCurrentYear() {
		return Calendar.getInstance().get(Calendar.YEAR);
	}

	/**
	 * 获取当前月份
	 * 
	 * @return 月份
	 */
	public static int getCurrentMonth() {
		return Calendar.getInstance().get(Calendar.MONTH) + 1;
	}

	/** 获取当前月天数 */
	public static int getCurrentMonthDays() {
		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH) + 1;
		return getMonthDays(year, month);
	}

	/** 获取当前日期 */
	public static int getCurrentDay() {
		return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
	}

	/** 获取当前时 */
	public static int getCurrentHour() {
		return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
	}

	/** 获取当前分 */
	public static int getCurrentMinute() {
		return Calendar.getInstance().get(Calendar.MINUTE);
	}

	/** 获取当前秒 */
	public static int getCurrentSecond() {
		return Calendar.getInstance().get(Calendar.SECOND);
	}

	/** 获取当前毫秒 */
	public static int getCurrentMillis() {
		return Calendar.getInstance().get(Calendar.MILLISECOND);
	}

	/**
	 * 获取当前时间的星期数:星期日=7;星期一=1;星期二=2;星期三=3;星期四=4;星期五=5;星期六=6;
	 * 
	 * @return 周数值
	 */
	public static int getCurrentWeek() {
		Calendar calendar = Calendar.getInstance();
		int week = calendar.get(Calendar.DAY_OF_WEEK);
		week = week - 1;
		if (week == 0)
			week = 7;

		return week;
	}

	/**
	 * 校验日期格式 <请简单说明此方法用途>
	 *
	 * @param str
	 * @return
	 * @return boolean
	 * @throws
	 * @author xubifang
	 * @date 2017年7月28日
	 */
	public static boolean isValidDate(String str) {
		boolean flag = false;
		// String str = "2007-01-02";
		DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			Date date = null;
			try {
				date = formatter.parse(str);
			} catch (ParseException e) {

			}
			Date date1 = formatter2.parse(str);
			if (str.equals(formatter.format(date))
					|| str.equals(formatter2.format(date1)))
				flag = true;
			return flag;
		} catch (Exception e) {

		}
		return flag;
	}


	/**
	 * 校验日期格式 <请简单说明此方法用途>
	 *
	 * @param str
	 * @return
	 * @return boolean
	 * @throws
	 * @author xubifang
	 * @date 2017年7月28日
	 */
	public static boolean isFormatDate(String str) {
		boolean flag = false;
		DateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			Date date1 = formatter2.parse(str);
			if (str.equals(formatter2.format(date1)))
				flag = true;
			return flag;
		} catch (Exception e) {

		}
		return flag;
	}


	/*************************************************************/
	// 获取当前时间格式，包括标准DT,D,T,17,14,12,8,7,6等常用格式
	/*************************************************************/

	/**
	 * 取得当前的日期时间字符串
	 * 
	 * @param format 格式,如String format = "yyyy-MM-dd HH:mm:ss";
	 * @return String 取得当前的日期时间字符串
	 */
	public static String getDateTimeString(String format) {
		return new SimpleDateFormat(format).format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyy-MM-dd HH:mm:ss
	 * 
	 * @return String 取得当前的日期时间字符串YYYY-MM-DD HH:mm:ss
	 */
	public static String getDateTimeString() {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyyMMddHHmmssSSS
	 * 
	 * @return String 取得当前的日期时间字符串yyyyMMddHHmmssSSS
	 */
	public static String getDateTime17String() {
		return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyyMMddHHmmss
	 * 
	 * @return String 取得当前的日期时间字符串yyyyMMddHHmmss
	 */
	public static String getDateTime14String() {
		return new SimpleDateFormat("yyyyMMddHHmmss").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyMMddHHmmss
	 * 
	 * @return String 取得当前的日期时间字符串yyMMddHHmmss
	 */
	public static String getDateTime12String() {
		return new SimpleDateFormat("yyMMddHHmmss").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyyMMdd
	 * 
	 * @return String 取得当前的日期时间字符串
	 */
	public static String getDateTime8String() {
		return new SimpleDateFormat("yyyyMMdd").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyy-MM
	 * 
	 * @return String 取得当前的日期时间字符串
	 */
	public static String getDateTime7String() {
		return new SimpleDateFormat("yyyy-MM").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyyMM
	 * 
	 * @return String 取得当前的日期时间字符串
	 */
	public static String getDateTime6String() {
		return new SimpleDateFormat("yyyyMM").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyy-MM-dd
	 * 
	 * @return String 取得当前的日期时间字符串
	 */
	public static String getDateString() {
		return new SimpleDateFormat("yyyy-MM-dd").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串HH:mm:ss
	 * 
	 * @return String 取得当前的日期时间字符串
	 */
	public static String getTimeString() {
		return new SimpleDateFormat("HH:mm:ss").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串yyyy-MM-dd HH:mm:ss,SSS
	 * 
	 * @return String 取得当前的日期时间字符串YYYY-MM-DD HH:mm:ss,SSS
	 */
	public static String getDateTimeSSSString() {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串YYYY/MM/DD HH:mm:ss (移动)
	 * 
	 * @return String 取得当前的日期时间字符串YYYY/MM/DD HH:mm:ss
	 */
	public static String getDateTimeStringSlash() {
		return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(nowDate());
	}

	/**
	 * 取得当前的日期时间字符串YYYY/MM/DD HH:mm:ss (移动)
	 * 
	 * @return String 取得当前的日期时间字符串YYYY/MM/DD HH:mm:ss
	 */
	public static String getDateStringSlash() {
		return new SimpleDateFormat("yyyy/MM/dd").format(nowDate());
	}

	/*************************************************************/
	// 获取当月月初和月末日期，上月下月月初月末，如2013-12-01,2013-12-31
	/*************************************************************/

	/** 取得当月第一天 */
	public static String getFirstMonthDay() {
		return getDateTime7String() + "-01";
	}

	/** 获到当前月最后一天yyyy-MM-dd */
	public static String getLastMonthDay() {
		String curYearMonth = getDateTime6String();
		return getLastMonthDay(curYearMonth);
	}

	/** 获取上一个月第一天 yyyy-MM-dd */
	public static String getPreviosMonthFirstDay() {
		String curYearMonth = getDateTime6String();
		String yearMonth = getPreviousYearMonth(curYearMonth);
		return yearMonth.substring(0, 4) + "-" + yearMonth.substring(4) + "-01";
	}

	/** 获到上一月最后一天yyyy-MM-dd */
	public static String getPreviosMonthLastDay() {
		String curYearMonth = getDateTime6String();
		String yearMonth = getPreviousYearMonth(curYearMonth);
		return getLastMonthDay(yearMonth);
	}

	/** 获取下一个月第一天 yyyy-MM-dd */
	public static String getNextMonthFirstDay() {
		String curYearMonth = getDateTime6String();
		String yearMonth = getNextYearMonth(curYearMonth);
		return yearMonth.substring(0, 4) + "-" + yearMonth.substring(4) + "-01";
	}

	/** 获到下一月最后一天yyyy-MM-dd */
	public static String getNextMonthLastDay() {
		String curYearMonth = getDateTime6String();
		String yearMonth = getNextYearMonth(curYearMonth);
		return getLastMonthDay(yearMonth);
	}

	/*************************************************************/
	// 获取向前推进的时间格式，包括推月、日、时、秒对应的日期和时间格式
	/*************************************************************/

	/**
	 * 获取前一天对应的当前时间,采用标准格式yyyy-MM-dd
	 * 
	 * @return String
	 */
	public static String getPreviousDateString() {
		return getPreviousDateTimeString("yyyy-MM-dd");
	}

	/**
	 * 获取前一天对应的当前时间,采用短信格式yyyy/MM/dd
	 * 
	 * @return String
	 */
	public static String getPreviousDateStringSlash() {
		return getPreviousDateTimeString("yyyy/MM/dd");
	}

	/**
	 * 获取前一天对应的当前时间
	 * 
	 * @param format 格式化如 yyyy-MM-dd HH:mm:ss
	 * @return String
	 */
	public static String getPreviousDateTimeString(String format) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, -1);

		return toDateTimeString(calendar, format);
	}

	/**
	 * 获取前一天对应的当前时间,采用标准格式yyyy-MM-dd HH:mm:ss
	 * 
	 * @return String
	 */
	public static String getPreviousDateTimeString() {
		return getPreviousDateTimeString("yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 获取前一天对应的当前时间,采用短信格式yyyy/MM/dd HH:mm:ss
	 * 
	 * @return String
	 */
	public static String getPreviousDateTimeStringSlash() {
		return getPreviousDateTimeString("yyyy/MM/dd HH:mm:ss");
	}

	// ////////////////////////////////////////////////
	// getPreviousDateString()
	// ///////////////////////////////////////////////

	/**
	 * 获取前几天对应的当前时间
	 * 
	 * @param days 相差天数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateString(int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, -days);

		return toDateString(calendar);
	}

	/**
	 * 获取前几年对应的当前时间
	 * 
	 * @param years 相差年数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringByYear(int years) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, -years);

		return toDateString(calendar);
	}

	/**
	 * 获取前几月对应的当前时间
	 * 
	 * @param months 相差月数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringByMonth(int months) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, -months);

		return toDateString(calendar);
	}

	/**
	 * 获取前几小时对应的当前时间
	 * 
	 * @param hours 相差小时数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringByHour(int hours) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, -hours);

		return toDateString(calendar);
	}

	/**
	 * 获取前几秒对应的当前时间
	 * 
	 * @param seconds 秒数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringBySecond(int seconds) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.SECOND, -seconds);

		return toDateString(calendar);
	}

	// ////////////////////////////////////////////////
	// getPreviousDateTimeString()
	// ///////////////////////////////////////////////

	/**
	 * 获取前几天对应的当前时间
	 * 
	 * @param days 相差天数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeString(int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, -days);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取前几年对应的当前时间
	 * 
	 * @param years 相差年数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringByYear(int years) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, -years);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取前几月对应的当前时间
	 * 
	 * @param months 相差月数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringByMonth(int months) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, -months);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取前几小时对应的当前时间
	 * 
	 * @param hours 相差小时数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringByHour(int hours) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, -hours);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取后几小时对应的当前时间
	 * 
	 * @param hours 相差小时数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getAfterDateTimeStringByHour(int hours) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, +hours);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取前几秒对应的当前时间
	 * 
	 * @param seconds 秒数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringBySecond(int seconds) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.SECOND, -seconds);

		return toDateTimeString(calendar);
	}

	// ////////////////////////////////////////////////
	// getPreviousDateString(date)
	// ///////////////////////////////////////////////

	/**
	 * 获取指定时间的前一天日期
	 * 
	 * @param date 指定日期
	 * @return yyyy-MM-dd
	 */
	public static String getPreviousDateString(String date) {
		return getPreviousDateString(date, 1);
	}

	/**
	 * 获取指定时间前几天的时间
	 * 
	 * @param date 指定日期
	 * @param days 相差天数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateString(String date, int days) {
		Calendar calendar = toCalendar(date + " 00:00:00");
		calendar.add(Calendar.DAY_OF_MONTH, -days);

		return toDateString(calendar);
	}

	/**
	 * 获取指定时间前几年的时间
	 * 
	 * @param datetime 指定时间
	 * @param years 相差年数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringByYear(String datetime, int years) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.YEAR, -years);

		return toDateString(calendar);
	}

	/**
	 * 获取指定时间前几月的时间
	 * 
	 * @param datetime 指定时间
	 * @param months 相差月数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringByMonth(String datetime, int months) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.MONTH, -months);

		return toDateString(calendar);
	}

	/**
	 * 获取指定时间前几小时的时间
	 * 
	 * @param datetime 指定时间
	 * @param hours 相差小时数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringByHour(String datetime, int hours) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.HOUR_OF_DAY, -hours);

		return toDateString(calendar);
	}

	/**
	 * 获取指定时间前几秒的时间
	 * 
	 * @param datetime 指定时间
	 * @param seconds 相差秒数
	 * @return String yyyy-MM-dd
	 */
	public static String getPreviousDateStringBySecond(String datetime, int seconds) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.SECOND, -seconds);

		return toDateString(calendar);
	}

	// ////////////////////////////////////////////////
	// getPreviousDateTimeString
	// ///////////////////////////////////////////////

	/**
	 * 获取指定时间前几天的时间
	 * 
	 * @param datetime 指定时间
	 * @param days 相差天数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeString(String datetime, int days) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.DAY_OF_MONTH, -days);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间前几月的时间
	 * 
	 * @param datetime 指定时间
	 * @param years 相差年数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringByYear(String datetime, int years) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.YEAR, -years);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间前几月的时间
	 * 
	 * @param datetime 指定时间
	 * @param months 相差月数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringByMonth(String datetime, int months) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.MONTH, -months);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间前几小时的时间
	 * 
	 * @param datetime 指定时间
	 * @param hours 相差小时数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringByHour(String datetime, int hours) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.HOUR_OF_DAY, -hours);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间前几秒的时间
	 * 
	 * @param datetime 指定时间
	 * @param second 秒数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getPreviousDateTimeStringBySecond(String datetime, int second) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.SECOND, -second);

		return toDateTimeString(calendar);
	}

	/*************************************************************/
	// 获取向后推进的时间格式，包括推月、日、时、秒对应的日期和时间格式
	/*************************************************************/

	/**
	 * 获取后一天对应的当前时间,采用标准格式yyyy-MM-dd
	 * 
	 * @return String
	 */
	public static String getNextDateString() {
		return getNextDateTimeString("yyyy-MM-dd");
	}

	/**
	 * 获取后一天对应的当前时间,采用标准格式yyyy-MM-dd HH:mm:ss
	 * 
	 * @return String
	 */
	public static String getNextDateTimeString() {
		return getNextDateTimeString("yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 获取后一天对应的当前时间
	 * 
	 * @param format 格式化如 yyyy-MM-dd HH:mm:ss
	 * @return String
	 */
	public static String getNextDateTimeString(String format) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, 1);

		return toDateTimeString(calendar, format);
	}

	/**
	 * 获取指定日期的后几天日期
	 * 
	 * @param days 天数
	 * @return Date 几天后的当前日期
	 */
	public static Date getNextDate(int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, days);

		return calendar.getTime();
	}

	/**
	 * 获取后几年对应的当前日期
	 * 
	 * @param years 年数
	 * @return 几年后的当前日期格式
	 */
	public static Date getNextDateByYeah(int years) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, years);

		return calendar.getTime();
	}

	/**
	 * 获取指定日期的后几月日期
	 * 
	 * @param months 月数
	 * @return Date 几月后的当前日期
	 */
	public static Date getNextDateByMonth(int months) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, months);

		return calendar.getTime();
	}

	/**
	 * 获取指定日期的后几小时日期
	 * 
	 * @param hours 小时数
	 * @return Date 几小时后的当前日期
	 */
	public static Date getNextDateByHour(int hours) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, hours);

		return calendar.getTime();
	}

	/**
	 * 获取指定日期的后几秒日期
	 * 
	 * @param hours 小时数
	 * @return Date 几小时后的当前日期
	 */
	public static Date getNextDateBySecond(int seconds) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.SECOND, seconds);

		return calendar.getTime();
	}

	/**
	 * 获取后几天对应的当前日期
	 * 
	 * @param days 日期数
	 * @return String 后几天对应的当前日期
	 */
	public static String getNextDateString(int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, days);

		return toDateString(calendar);
	}

	/**
	 * 获取后几年对应的当天日期
	 * 
	 * @param years 年数
	 * @return String 后几年的日期yyyy-MM-dd
	 */
	public static String getNextDateStringByYeah(int years) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, years);

		return toDateString(calendar);
	}

	/**
	 * 获取后几月对应的当前日期
	 * 
	 * @param months 月数
	 * @return String 几月后的当前日期
	 */
	public static String getNextDateStringByMonth(int months) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, months);

		return toDateString(calendar);
	}

	/**
	 * 获取后几小时对应的当前日期
	 * 
	 * @param hours 格式化如 yyyy-MM-dd
	 * @return String 几小时后对应的当前日期
	 */
	public static String getNextDateStringByHour(int hours) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, hours);

		return toDateString(calendar);
	}

	/**
	 * 获取后几秒对应的当前日期
	 * 
	 * @param seconds 秒数
	 * @return String 几秒后对应的当前日期
	 */
	public static String getNextDateStringBySecond(int seconds) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.SECOND, seconds);

		return toDateString(calendar);
	}

	/**
	 * 获取指定时间的后一天日期
	 * 
	 * @param date 指定日期
	 * @return yyyy-MM-dd
	 */
	public static String getNextDateString(String date) {
		return getNextDateString(date, 1);
	}

	/**
	 * 获取指定日期的后几天日期
	 * 
	 * @param date 指定日期
	 * @param days 指定天数
	 * @return yyyy-MM-dd
	 */
	public static String getNextDateString(String date, int days) {
		Calendar calendar = toCalendar(date + " 00:00:00");
		calendar.add(Calendar.DAY_OF_MONTH, days);
		return toDateString(calendar);
	}

	/**
	 * 获取指定日期的后几年日期
	 * 
	 * @param date 指定日期
	 * @param years 指定年数
	 * @return yyyy-MM-dd
	 * @throws Exception
	 */
	public static String getNextDateStringByYear(String date, int years) {
		Calendar calendar = toCalendar(date + " 00:00:00");
		calendar.add(Calendar.YEAR, years);
		return toDateString(calendar);
	}

	/**
	 * 获取指定日期的后几月日期
	 * 
	 * @param date 指定日期
	 * @param months 指定月数
	 * @return yyyy-MM-dd
	 * @throws Exception
	 */
	public static String getNextDateStringByMonth(String date, int months) {
		Calendar calendar = toCalendar(date + " 00:00:00");
		calendar.add(Calendar.MONTH, months);
		return toDateString(calendar);
	}

	/**
	 * 获取指定日期的后几小时
	 * 
	 * @param date 指定日期
	 * @param hours 指定小时数
	 * @return yyyy-MM-dd
	 * @throws Exception
	 */
	public static String getNextDateStringByHour(String date, int hours) {
		Calendar calendar = toCalendar(date + " 00:00:00");
		calendar.add(Calendar.HOUR_OF_DAY, hours);
		return toDateString(calendar);
	}

	/**
	 * 获取指定日期的后几秒
	 * 
	 * @param date 指定日期
	 * @param seconds 指定秒数
	 * @return yyyy-MM-dd
	 * @throws Exception
	 */
	public static String getNextDateStringBySecond(String date, int seconds) {
		Calendar calendar = toCalendar(date + " 00:00:00");
		calendar.add(Calendar.SECOND, seconds);
		return toDateString(calendar);
	}

	/**
	 * 获取后几天对应的当前时间
	 * 
	 * @param days 天数
	 * @return String 几天后对应的当前时间
	 */
	public static String getNextDateTimeString(int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, days);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取后几年对应的当前时间
	 * 
	 * @param years 年数
	 * @return String 几年后对应的当前时间
	 */
	public static String getNextDateTimeStringByYear(int years) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, years);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取后几月对应的当前时间
	 * 
	 * @param months 月数
	 * @return String 几月后对应的当前时间
	 */
	public static String getNextDateTimeStringByMonth(int months) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, months);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取后几小时对应的当前时间
	 * 
	 * @param hours 小时数
	 * @return String 几小时后对应的当前时间
	 */
	public static String getNextDateTimeStringByHour(int hours) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, hours);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取后几秒对应的当前时间
	 * 
	 * @param seconds 秒数
	 * @return String 几秒后对应的当前时间
	 */
	public static String getNextDateTimeStringBySecond(int seconds) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.SECOND, seconds);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间后几日的时间
	 * 
	 * @param datetime 指定时间
	 * @param days 相差日数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getNextDateTimeString(String datetime, int days) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.DAY_OF_MONTH, days);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间后几年的时间
	 * 
	 * @param datetime 指定时间
	 * @param years 相差年数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getNextDateTimeStringByYear(String datetime, int years) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.YEAR, years);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间后几月的时间
	 * 
	 * @param datetime 指定时间
	 * @param months 相差月数
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getNextDateTimeStringByMonth(String datetime, int months) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.MONTH, months);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间后几小时对应的当前时间
	 * 
	 * @param datetime 格式 yyyy-MM-dd HH:mm:ss
	 * @param hours 小时数
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getNextDateTimeStringByHour(String datetime, int hours) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.HOUR_OF_DAY, hours);

		return toDateTimeString(calendar);
	}

	/**
	 * 获取指定时间后几秒对应的当前时间
	 * 
	 * @param datetime 格式 yyyy-MM-dd HH:mm:ss
	 * @param seconds 秒数
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getNextDateTimeStringBySecond(String datetime, int seconds) {
		Calendar calendar = toCalendar(datetime);
		calendar.add(Calendar.SECOND, seconds);

		return toDateTimeString(calendar);
	}

	/**
	 * 将字符串日期转换成中文的月日字符串日期，如“1月4日”
	 * 
	 * @return
	 * @return String
	 * @throws ParseException
	 * @throws
	 * @author liushici
	 * @date 2017年1月4日
	 */
	public static String toStringMDCh(String date) throws ParseException {
		SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return new SimpleDateFormat("M月d日").format(s.parse(date));
	}

	/**
	 * 根据出生日期获取年龄
	 * 
	 * @param birthDate
	 * @return
	 * @return int
	 * @throws
	 * @author huchengjie
	 * @date 2017年4月21日
	 */
	public static int getAge(Date birthDate) {

		if (birthDate == null)
			throw new RuntimeException("出生日期不能为null");

		int age = 0;

		Date now = new Date();

		SimpleDateFormat format_y = new SimpleDateFormat("yyyy");
		SimpleDateFormat format_M = new SimpleDateFormat("MM");

		String birth_year = format_y.format(birthDate);
		String this_year = format_y.format(now);

		String birth_month = format_M.format(birthDate);
		String this_month = format_M.format(now);

		// 初步，估算
		age = Integer.parseInt(this_year) - Integer.parseInt(birth_year);

		// 如果未到出生月份，则age - 1
		if (this_month.compareTo(birth_month) < 0)
			age -= 1;
		if (age < 0)
			age = 0;
		return age;
	}

	/**
	 * 比较日期是否在指定日期范围内
	 * 
	 * @param nowdate
	 * @param startdate
	 * @param enddate
	 * @return
	 */
	public static Boolean compareToDate(String nowdate, String startdate, String enddate, String formats) {
		SimpleDateFormat ft = new SimpleDateFormat(formats/* "yyyy-MM-dd" */);
		// String startdate = "2016-04-11";
		// String enddate = "2016-07-11";
		// String nowdate = "2016-07-11";
		try {
			Date sdate = ft.parse(startdate);
			Date edate = ft.parse(enddate);
			Date ndate = ft.parse(nowdate);
			if (ndate.compareTo(sdate) >= 0 && ndate.compareTo(edate) <= 0) {
				return true;
			}
		} catch (ParseException e) {
		}
		return false;
	}

	/***
	 * 将日期或月份格式化成时间，适用于区间查询<br>
	 * 2017-10格式化成 2017-10-01 00:00:00 或2017-10-31 23:59:59<br>
	 * 2017-10-01格式化成 2017-10-01 00:00:00或2017-10-01 23:59:59
	 * 
	 * @param date
	 * @param isStartDate
	 * @return
	 * @return String
	 * @throws
	 * @author Penghu
	 * @date 2017年12月7日
	 */
	public static String formatDateToTime(String date, boolean isStartDate) {
		if (Validates.isEmpty(date)) {
			return "";
		}
		String startTime = " 00:00:00";
		String endTime = " 23:59:59";
		if (date.length() == 10) {
			if (isStartDate) {
				return date + startTime;
			} else {
				return date + endTime;
			}
		}
		else if (date.length() == 7) {
			if (isStartDate) {
				return date + "-01" + startTime;
			} else {
				int month = DateTimes.getMonthDays(date.replace("-", ""));
				return date + "-" + month + endTime;
			}
		} else if(date.length() == 16) {
			if(!isStartDate) {
				return date + ":59";
			}
		}

		return date;

	}

	public static String formatDateToTime(String date, boolean isStartDate, String time) {
		if (Validates.isEmpty(date)) {
			return "";
		}
		if(time == null) {
			time = "";
		}
		if (date.length() == 10) {
			if (isStartDate) {
				return date + time;
			} else {
				return date + time;
			}
		}
		if (date.length() == 7) {
			if (isStartDate) {
				return date + "-01" + time;
			} else {
				int month = DateTimes.getMonthDays(date.replace("-", ""));
				return date + "-" + month + time;
			}
		}

		return date;

	}
}
